package com.dev.framework.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import com.dev.common.constant.ShiroConstants;
import com.dev.common.exception.user.CaptchaException;
import com.dev.common.utils.StringUtils;
import com.google.code.kaptcha.Constants;

@Configuration
public class CaptchaInterceptor implements HandlerInterceptor
{
    /**
     *  在请求处理之前进行调用（Controller方法调用之前）
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception
    {
        if (!"post".equals(request.getMethod().toLowerCase()))
        {
            return true;
        }
        // 进行逻辑判断，如果ok就返回true，不行就返回false，返回false就不会处理改请求
        Object obj = request.getSession().getAttribute(Constants.KAPTCHA_SESSION_KEY);
        String validateCode = request.getParameter(ShiroConstants.CURRENT_VALIDATECODE);
        // 不主动移除将会被暴力破解
        request.getSession().removeAttribute(Constants.KAPTCHA_SESSION_KEY);
        String code = String.valueOf(obj != null ? obj : "");
        if (StringUtils.isEmpty(validateCode) || !validateCode.equalsIgnoreCase(code))
        {
            throw  new CaptchaException();
        }
        return true;
    }

    /**
     * 请求处理之后进行调用，但是在视图被渲染之前（Controller方法调用之后）
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception
    {
        //
    }

    /**
    * 在整个请求结束之后被调用，也就是在DispatcherServlet 渲染了对应的视图之后执行（主要是用于进行资源清理工作）
    */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception
    {
    }
}